package com.priox.sigar.application.sociedad;

import com.googlecode.ehcache.annotations.Cacheable;
import com.mm.support.mapper.DTOMapperService;
import com.priox.sigar.application.mappers.SociedadMapper;
import com.priox.sigar.application.mappers.TipoCambioMapper;
import com.priox.sigar.client.dto.MonedaDTO;
import com.priox.sigar.client.dto.SociedadDTO;
import com.priox.sigar.client.dto.TipoCambioDTO;
import com.priox.sigar.client.flt.TipoCambioFlt;
import com.priox.sigar.domain.model.Sociedad;
import com.priox.sigar.domain.model.SociedadRepository;
import com.priox.sigar.domain.model.TipoCambio;
import com.priox.sigar.domain.model.TipoCambioRepository;
import com.priox.sigar.server.infrastructure.persistence.exception.ApplicationException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import java.util.Date;
import java.util.Iterator;
import java.util.List;

@Component
public class RegistroTipoCambioAppImpl implements RegistroTipoCambioApp {

    @Autowired
    DTOMapperService mapperService;

    @Autowired
    TipoCambioRepository tipoCambioRepository;

    @Autowired
    TipoCambioMapper tipoCambioMapper;

    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public void save(List<TipoCambio> tipo, boolean updateMode) {
        if (updateMode) {
            for (TipoCambio tipoCambio : tipo) {
                tipoCambioRepository.merge(tipoCambio);
            }
        } else {
            for (TipoCambio tipoCambio : tipo) {
                tipoCambioRepository.persist(tipoCambio);
            }

        }
    }

    public TipoCambioDTO findById(Date fecha) {
        TipoCambioDTO tipoCambioDTO = new TipoCambioDTO();
        tipoCambioDTO.setFecha(fecha);

        List<MonedaDTO> result = tipoCambioMapper.findTipoCambioMoneda(fecha);

        if (result.isEmpty()) {
            result = tipoCambioMapper.findAllMonedas();
        }
        tipoCambioDTO.setMonedas(result);
        return tipoCambioDTO;
    }

    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public void delete(Date fecha) {
        tipoCambioMapper.deleteAll(fecha);
    }
}
